﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DAL
{
    public partial class EstructuraCosto
    {
        public void SetAdd(dbGestionDataContext _db, string descripcion, int idObra, int idUsuarioCre, int idPadre, bool bitCaja)
        {
            this.descripcion = descripcion;
            this.fechaCre = DateTime.Now;
            this.fechaMod = DateTime.Now;
            this.nivel = 0;
            this.idObra = idObra;
            this.usuarioCre = idUsuarioCre;
            this.usuarioMod = idUsuarioCre;
            this.monto = 0;
            this.montoUso = 0;
            this.idPadre = idPadre;
            this.idMoneda = 3; // por default moneda Soles
            this.tipoCambio = 1;
            this.bitCaja = bitCaja;
            _db.EstructuraCostos.InsertOnSubmit(this);
        }


        public int getidAnterior(dbGestionDataContext _db, int idinternal, int idObra)
        {
            int intAnterior = 0;


            var id = from i in _db.EstructuraCostos
                     where i.idInternal < idinternal && i.idObra == idObra
                     group i by i.idObra into g
                     select new
                     {
                         idAnterior = g.Max(p => p.idInternal)
                     };

            if (id.Count() > 0)
            {
                intAnterior = id.First().idAnterior;

            }
            else
            {
                throw new Exception("No existe Registros");
            }


            return intAnterior;

        }

        public int getidSiguiente(dbGestionDataContext _db, int idinternal, int idObra)
        {
            int intSiguiente = 0;

            //revisar la sentencia generada
            var id = from i in _db.EstructuraCostos
                     where i.idInternal > idinternal && i.idObra == idObra
                     group i by i.idObra into g
                     select new
                     {
                         idSiguiente = g.Min(p => p.idInternal)
                     };


            if (id.Count() > 0)
            {
                intSiguiente = id.First().idSiguiente;

            }
            else
            {
                throw new Exception("No existe Registros");
            }

            return intSiguiente;
        }


        public  decimal getMontoBaseTotal(dbGestionDataContext _db,int idEC)
        {
            decimal result = 0;

            var q = (from i in _db.EstructuraCostoItems
                      where i.idEstructuraCosto == idEC &
                      i.nivel==0 & i.idRecurso!=null
                      select i);
            if (q.Count()>0)
            {
                result=q.Sum(p=>p.total*p.tipoCambio).Value;
            }
            
          return Math.Round(result, 2);
        }
        public decimal getMontoUsoTotal(dbGestionDataContext _db)
        {
            decimal result = 0;

            var q = (from i in _db.EstructuraCostoItems
                     where i.idEstructuraCosto == this.idInternal &
                     i.totalUso > 0
                     select new {
                         totalMontoUsoBase = i.totalUso*i.tipoCambio
                     });
            if (q.Count() > 0)
            {
                result = q.Sum(p => p.totalMontoUsoBase).Value;
            }


            return Math.Round(result, 2);
        }
        public bool updateMontoMonBase(dbGestionDataContext _db)
        {
            
            this.monto = this.getMontoBaseTotal(_db, this.idInternal);
           
            _db.SubmitChanges();
            
            return true;
        }

        //public void updateControlitem(dbGestionDataContext _db,int idComparativo)
        //        {
        //                var w = from a in _db.ComparativoItems
        //                    where a.idComparativo == idComparativo
        //                    select a;
        //                foreach (var i in w)
        //                {
        //                    EstructuraCostoItem ecItem= _db.EstructuraCostoItems.Single(p=>p.idInternal==i.idEstructuraCostoItem);
        //                    if (ecItem.bitControlCant == null)
        //                    {
        //                        ecItem.bitControlCant = i.bitControlCant;
        //                    }else if (ecItem.bitControlCant != i.bitControlCant)
        //                    {
        //                        if (ecItem.bitControlCant==true)
        //                        {
        //                            throw new Exception("No puede  cambiar de control del recurso Por Unidad ");
        //                        }else
        //                            throw new Exception("No puede  cambiar de control del recurso Por Dinero ");
        //                    }
        //                }




        
        //        }
        public void updateUsoFromComparativo(dbGestionDataContext _db)
        {

            //actualiza la estructura de Compras por el comparativo
            this.montoUso = 0;
            var w = from b in _db.EstructuraCostoItems
                    where b.idEstructuraCosto == this.idInternal 
                    select b;

            foreach (var i in w)
            {
                i.updateUso(_db);
            }

            this.montoUso = this.getMontoUsoTotal(_db);
            _db.SubmitChanges();


        }


    }
}
